GdiPlusTypes.h revision ee451cb395940862dad63c85adfe8f2fd55e864c
1/**************************************************************************\ 2* 3* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved. 4* 5* Module Name: 6* 7* GdiplusTypes.h 8* 9* Abstract: 10* 11* Basic types used by GDI+ 12* 13\**************************************************************************/ 14 15#ifndef _GDIPLUSTYPES_H 16#define _GDIPLUSTYPES_H 17 18#ifndef DCR_USE_NEW_175866 19 20//-------------------------------------------------------------------------- 21// LIB version initialization functions 22//-------------------------------------------------------------------------- 23 24typedef VOID (__cdecl *DEBUGEVENTFUNCTION)(INT level, CHAR *message); 25 26extern "C" BOOL __stdcall InitializeGdiplus(DEBUGEVENTFUNCTION); 27extern "C" VOID __stdcall UninitializeGdiplus(); 28 29#endif 30 31//-------------------------------------------------------------------------- 32// Callback functions 33//-------------------------------------------------------------------------- 34 35extern "C" { 36typedef BOOL (CALLBACK * ImageAbort)(VOID *); 37typedef ImageAbort DrawImageAbort; 38typedef ImageAbort GetThumbnailImageAbort; 39} 40 41// Callback for EnumerateMetafile methods. The parameters are: 42 43// recordType WMF, EMF, or EMF+ record type 44// flags (always 0 for WMF/EMF records) 45// dataSize size of the record data (in bytes), or 0 if no data 46// data pointer to the record data, or NULL if no data 47// callbackData pointer to callbackData, if any 48 49// This method can then call Metafile::PlayRecord to play the 50// record that was just enumerated. If this method returns 51// FALSE, the enumeration process is aborted. Otherwise, it continues. 52 53extern "C" { 54typedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*); 55} 56 57//-------------------------------------------------------------------------- 58// Primitive data types 59// 60// NOTE: 61// Types already defined in standard header files: 62// INT8 63// UINT8 64// INT16 65// UINT16 66// INT32 67// UINT32 68// INT64 69// UINT64 70// 71// Avoid using the following types: 72// LONG - use INT 73// ULONG - use UINT 74// DWORD - use UINT32 75//-------------------------------------------------------------------------- 76 77typedef float REAL; 78 79#define REAL_MAX FLT_MAX 80#define REAL_MIN FLT_MIN 81#define REAL_TOLERANCE (FLT_MIN * 100) 82#define REAL_EPSILON 1.192092896e-07F /* FLT_EPSILON */ 83 84//-------------------------------------------------------------------------- 85// Forward declarations of various internal classes 86//-------------------------------------------------------------------------- 87 88class Size; 89class SizeF; 90class Point; 91class PointF; 92class Rect; 93class RectF; 94class CharacterRange; 95 96//-------------------------------------------------------------------------- 97// Return values from any GDI+ API 98//-------------------------------------------------------------------------- 99 100enum Status 101{ 102 Ok = 0, 103 GenericError = 1, 104 InvalidParameter = 2, 105 OutOfMemory = 3, 106 ObjectBusy = 4, 107 InsufficientBuffer = 5, 108 NotImplemented = 6, 109 Win32Error = 7, 110 WrongState = 8, 111 Aborted = 9, 112#ifdef DCR_USE_NEW_135429 113 FileNotFound = 10, 114 ValueOverflow = 11, 115 AccessDenied = 12, 116 UnknownImageFormat = 13, 117 FontFamilyNotFound = 14, 118 FontStyleNotFound = 15, 119 NotTrueTypeFont = 16, 120#else 121 NotFound = 10, 122 ValueOverflow = 11, 123#endif 124 UnsupportedGdiplusVersion = 17, 125 GdiplusNotInitialized 126 127}; 128 129//-------------------------------------------------------------------------- 130// Represents a dimension in a 2D coordinate system 131// (floating-point coordinates) 132//-------------------------------------------------------------------------- 133 134class SizeF 135{ 136public: 137 138 // Default constructor 139 SizeF() 140 { 141 Width = Height = 0.0f; 142 } 143 144 SizeF(IN const SizeF& size) 145 { 146 Width = size.Width; 147 Height = size.Height; 148 } 149 150 SizeF(IN REAL width, 151 IN REAL height) 152 { 153 Width = width; 154 Height = height; 155 } 156 157 SizeF operator+(IN const SizeF& sz) const 158 { 159 return SizeF(Width + sz.Width, 160 Height + sz.Height); 161 } 162 163 SizeF operator-(IN const SizeF& sz) const 164 { 165 return SizeF(Width - sz.Width, 166 Height - sz.Height); 167 } 168 169 BOOL Equals(IN const SizeF& sz) const 170 { 171 return (Width == sz.Width) && (Height == sz.Height); 172 } 173 174 BOOL Empty() const 175 { 176 return (Width == 0.0f && Height == 0.0f); 177 } 178 179public: 180 181 REAL Width; 182 REAL Height; 183}; 184 185//-------------------------------------------------------------------------- 186// Represents a dimension in a 2D coordinate system 187// (integer coordinates) 188//-------------------------------------------------------------------------- 189 190class Size 191{ 192public: 193 194 // Default constructor 195 Size() 196 { 197 Width = Height = 0; 198 } 199 200 Size(IN const Size& size) 201 { 202 Width = size.Width; 203 Height = size.Height; 204 } 205 206 Size(IN INT width, 207 IN INT height) 208 { 209 Width = width; 210 Height = height; 211 } 212 213 Size operator+(IN const Size& sz) const 214 { 215 return Size(Width + sz.Width, 216 Height + sz.Height); 217 } 218 219 Size operator-(IN const Size& sz) const 220 { 221 return Size(Width - sz.Width, 222 Height - sz.Height); 223 } 224 225 BOOL Equals(IN const Size& sz) const 226 { 227 return (Width == sz.Width) && (Height == sz.Height); 228 } 229 230 BOOL Empty() const 231 { 232 return (Width == 0 && Height == 0); 233 } 234 235public: 236 237 INT Width; 238 INT Height; 239}; 240 241//-------------------------------------------------------------------------- 242// Represents a location in a 2D coordinate system 243// (floating-point coordinates) 244//-------------------------------------------------------------------------- 245 246class PointF 247{ 248public: 249 PointF() 250 { 251 X = Y = 0.0f; 252 } 253 254 PointF(IN const PointF &point) 255 { 256 X = point.X; 257 Y = point.Y; 258 } 259 260 PointF(IN const SizeF &size) 261 { 262 X = size.Width; 263 Y = size.Height; 264 } 265 266 PointF(IN REAL x, 267 IN REAL y) 268 { 269 X = x; 270 Y = y; 271 } 272 273 PointF operator+(IN const PointF& point) const 274 { 275 return PointF(X + point.X, 276 Y + point.Y); 277 } 278 279 PointF operator-(IN const PointF& point) const 280 { 281 return PointF(X - point.X, 282 Y - point.Y); 283 } 284 285 BOOL Equals(IN const PointF& point) 286 { 287 return (X == point.X) && (Y == point.Y); 288 } 289 290public: 291 292 REAL X; 293 REAL Y; 294}; 295 296//-------------------------------------------------------------------------- 297// Represents a location in a 2D coordinate system 298// (integer coordinates) 299//-------------------------------------------------------------------------- 300 301class Point 302{ 303public: 304 Point() 305 { 306 X = Y = 0; 307 } 308 309 Point(IN const Point &point) 310 { 311 X = point.X; 312 Y = point.Y; 313 } 314 315 Point(IN const Size &size) 316 { 317 X = size.Width; 318 Y = size.Height; 319 } 320 321 Point(IN INT x, 322 IN INT y) 323 { 324 X = x; 325 Y = y; 326 } 327 328 Point operator+(IN const Point& point) const 329 { 330 return Point(X + point.X, 331 Y + point.Y); 332 } 333 334 Point operator-(IN const Point& point) const 335 { 336 return Point(X - point.X, 337 Y - point.Y); 338 } 339 340 BOOL Equals(IN const Point& point) 341 { 342 return (X == point.X) && (Y == point.Y); 343 } 344 345public: 346 347 INT X; 348 INT Y; 349}; 350 351//-------------------------------------------------------------------------- 352// Represents a rectangle in a 2D coordinate system 353// (floating-point coordinates) 354//-------------------------------------------------------------------------- 355 356class RectF 357{ 358public: 359 360 // Default constructor 361 362 RectF() 363 { 364 X = Y = Width = Height = 0.0f; 365 } 366 367 RectF(IN REAL x, 368 IN REAL y, 369 IN REAL width, 370 IN REAL height) 371 { 372 X = x; 373 Y = y; 374 Width = width; 375 Height = height; 376 } 377 378 RectF(IN const PointF& location, 379 IN const SizeF& size) 380 { 381 X = location.X; 382 Y = location.Y; 383 Width = size.Width; 384 Height = size.Height; 385 } 386 387 RectF* Clone() const 388 { 389 return new RectF(X, Y, Width, Height); 390 } 391 392 VOID GetLocation(OUT PointF* point) const 393 { 394 point->X = X; 395 point->Y = Y; 396 } 397 398 VOID GetSize(OUT SizeF* size) const 399 { 400 size->Width = Width; 401 size->Height = Height; 402 } 403 404 VOID GetBounds(OUT RectF* rect) const 405 { 406 rect->X = X; 407 rect->Y = Y; 408 rect->Width = Width; 409 rect->Height = Height; 410 } 411 412 // Return the left, top, right, and bottom 413 // coordinates of the rectangle 414 415 REAL GetLeft() const 416 { 417 return X; 418 } 419 420 REAL GetTop() const 421 { 422 return Y; 423 } 424 425 REAL GetRight() const 426 { 427 return X+Width; 428 } 429 430 REAL GetBottom() const 431 { 432 return Y+Height; 433 } 434 435 // Determine if the rectangle is empty 436 BOOL IsEmptyArea() const 437 { 438 return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON); 439 } 440 441 BOOL Equals(IN const RectF & rect) const 442 { 443 return X == rect.X && 444 Y == rect.Y && 445 Width == rect.Width && 446 Height == rect.Height; 447 } 448 449 BOOL Contains(IN REAL x, 450 IN REAL y) const 451 { 452 return x >= X && x < X+Width && 453 y >= Y && y < Y+Height; 454 } 455 456 BOOL Contains(IN const PointF& pt) const 457 { 458 return Contains(pt.X, pt.Y); 459 } 460 461 BOOL Contains(IN const RectF& rect) const 462 { 463 return (X <= rect.X) && (rect.GetRight() <= GetRight()) && 464 (Y <= rect.Y) && (rect.GetBottom() <= GetBottom()); 465 } 466 467 VOID Inflate(IN REAL dx, 468 IN REAL dy) 469 { 470 X -= dx; 471 Y -= dy; 472 Width += 2*dx; 473 Height += 2*dy; 474 } 475 476 VOID Inflate(IN const PointF& point) 477 { 478 Inflate(point.X, point.Y); 479 } 480 481 // Intersect the current rect with the specified object 482 483 BOOL Intersect(IN const RectF& rect) 484 { 485 return Intersect(*this, *this, rect); 486 } 487 488 // Intersect rect a and b and save the result into c 489 // Notice that c may be the same object as a or b. 490 491 static BOOL Intersect(OUT RectF& c, 492 IN const RectF& a, 493 IN const RectF& b) 494 { 495 REAL right = min(a.GetRight(), b.GetRight()); 496 REAL bottom = min(a.GetBottom(), b.GetBottom()); 497 REAL left = max(a.GetLeft(), b.GetLeft()); 498 REAL top = max(a.GetTop(), b.GetTop()); 499 500 c.X = left; 501 c.Y = top; 502 c.Width = right - left; 503 c.Height = bottom - top; 504 return !c.IsEmptyArea(); 505 } 506 507 // Determine if the specified rect intersects with the 508 // current rect object. 509 510 BOOL IntersectsWith(IN const RectF& rect) const 511 { 512 return (GetLeft() < rect.GetRight() && 513 GetTop() < rect.GetTop() && 514 GetRight() > rect.GetLeft() && 515 GetBottom() > rect.GetTop()); 516 } 517 518 static BOOL Union(OUT RectF& c, 519 IN const RectF& a, 520 IN const RectF& b) 521 { 522 REAL right = max(a.GetRight(), b.GetRight()); 523 REAL bottom = max(a.GetBottom(), b.GetBottom()); 524 REAL left = min(a.GetLeft(), b.GetLeft()); 525 REAL top = min(a.GetTop(), b.GetTop()); 526 527 c.X = left; 528 c.Y = top; 529 c.Width = right - left; 530 c.Height = bottom - top; 531 return !c.IsEmptyArea(); 532 } 533 534 VOID Offset(IN const PointF& point) 535 { 536 Offset(point.X, point.Y); 537 } 538 539 VOID Offset(IN REAL dx, 540 IN REAL dy) 541 { 542 X += dx; 543 Y += dy; 544 } 545 546public: 547 548 REAL X; 549 REAL Y; 550 REAL Width; 551 REAL Height; 552}; 553 554//-------------------------------------------------------------------------- 555// Represents a rectangle in a 2D coordinate system 556// (integer coordinates) 557//-------------------------------------------------------------------------- 558 559class Rect 560{ 561public: 562 563 // Default constructor 564 565 Rect() 566 { 567 X = Y = Width = Height = 0; 568 } 569 570 Rect(IN INT x, 571 IN INT y, 572 IN INT width, 573 IN INT height) 574 { 575 X = x; 576 Y = y; 577 Width = width; 578 Height = height; 579 } 580 581 Rect(IN const Point& location, 582 IN const Size& size) 583 { 584 X = location.X; 585 Y = location.Y; 586 Width = size.Width; 587 Height = size.Height; 588 } 589 590 Rect* Clone() const 591 { 592 return new Rect(X, Y, Width, Height); 593 } 594 595 VOID GetLocation(OUT Point* point) const 596 { 597 point->X = X; 598 point->Y = Y; 599 } 600 601 VOID GetSize(OUT Size* size) const 602 { 603 size->Width = Width; 604 size->Height = Height; 605 } 606 607 VOID GetBounds(OUT Rect* rect) const 608 { 609 rect->X = X; 610 rect->Y = Y; 611 rect->Width = Width; 612 rect->Height = Height; 613 } 614 615 // Return the left, top, right, and bottom 616 // coordinates of the rectangle 617 618 INT GetLeft() const 619 { 620 return X; 621 } 622 623 INT GetTop() const 624 { 625 return Y; 626 } 627 628 INT GetRight() const 629 { 630 return X+Width; 631 } 632 633 INT GetBottom() const 634 { 635 return Y+Height; 636 } 637 638 // Determine if the rectangle is empty 639 BOOL IsEmptyArea() const 640 { 641 return (Width <= 0) || (Height <= 0); 642 } 643 644 BOOL Equals(IN const Rect & rect) const 645 { 646 return X == rect.X && 647 Y == rect.Y && 648 Width == rect.Width && 649 Height == rect.Height; 650 } 651 652 BOOL Contains(IN INT x, 653 IN INT y) const 654 { 655 return x >= X && x < X+Width && 656 y >= Y && y < Y+Height; 657 } 658 659 BOOL Contains(IN const Point& pt) const 660 { 661 return Contains(pt.X, pt.Y); 662 } 663 664 BOOL Contains(IN Rect& rect) const 665 { 666 return (X <= rect.X) && (rect.GetRight() <= GetRight()) && 667 (Y <= rect.Y) && (rect.GetBottom() <= GetBottom()); 668 } 669 670 VOID Inflate(IN INT dx, 671 IN INT dy) 672 { 673 X -= dx; 674 Y -= dy; 675 Width += 2*dx; 676 Height += 2*dy; 677 } 678 679 VOID Inflate(IN const Point& point) 680 { 681 Inflate(point.X, point.Y); 682 } 683 684 // Intersect the current rect with the specified object 685 686 BOOL Intersect(IN const Rect& rect) 687 { 688 return Intersect(*this, *this, rect); 689 } 690 691 // Intersect rect a and b and save the result into c 692 // Notice that c may be the same object as a or b. 693 694 static BOOL Intersect(OUT Rect& c, 695 IN const Rect& a, 696 IN const Rect& b) 697 { 698 INT right = min(a.GetRight(), b.GetRight()); 699 INT bottom = min(a.GetBottom(), b.GetBottom()); 700 INT left = max(a.GetLeft(), b.GetLeft()); 701 INT top = max(a.GetTop(), b.GetTop()); 702 703 c.X = left; 704 c.Y = top; 705 c.Width = right - left; 706 c.Height = bottom - top; 707 return !c.IsEmptyArea(); 708 } 709 710 // Determine if the specified rect intersects with the 711 // current rect object. 712 713 BOOL IntersectsWith(IN const Rect& rect) const 714 { 715 return (GetLeft() < rect.GetRight() && 716 GetTop() < rect.GetTop() && 717 GetRight() > rect.GetLeft() && 718 GetBottom() > rect.GetTop()); 719 } 720 721 static BOOL Union(OUT Rect& c, 722 IN const Rect& a, 723 IN const Rect& b) 724 { 725 INT right = max(a.GetRight(), b.GetRight()); 726 INT bottom = max(a.GetBottom(), b.GetBottom()); 727 INT left = min(a.GetLeft(), b.GetLeft()); 728 INT top = min(a.GetTop(), b.GetTop()); 729 730 c.X = left; 731 c.Y = top; 732 c.Width = right - left; 733 c.Height = bottom - top; 734 return !c.IsEmptyArea(); 735 } 736 737 VOID Offset(IN const Point& point) 738 { 739 Offset(point.X, point.Y); 740 } 741 742 VOID Offset(IN INT dx, 743 IN INT dy) 744 { 745 X += dx; 746 Y += dy; 747 } 748 749public: 750 751 INT X; 752 INT Y; 753 INT Width; 754 INT Height; 755}; 756 757// A user must mange memory for PathData. 758 759class PathData 760{ 761public: 762 PathData() 763 { 764 Count = 0; 765 Points = NULL; 766 Types = NULL; 767 } 768 769 ~PathData() 770 { 771 if (Points != NULL) 772 { 773 delete Points; 774 } 775 776 if (Types != NULL) 777 { 778 delete Types; 779 } 780 } 781 782#ifdef DCR_USE_NEW_250932 783 784private: 785 PathData(const PathData &); 786 PathData& operator=(const PathData &); 787 788#endif 789 790public: 791 INT Count; 792 PointF* Points; 793 BYTE* Types; 794}; 795 796 797//----------------------------- 798// text character range 799//----------------------------- 800 801class CharacterRange 802{ 803public: 804 CharacterRange( 805 INT first, 806 INT length 807 ) : 808 First (first), 809 Length (length) 810 {} 811 812 CharacterRange() : First(0), Length(0) 813 {} 814 815 CharacterRange & operator = (const CharacterRange &rhs) 816 { 817 First = rhs.First; 818 Length = rhs.Length; 819 return *this; 820 } 821 822 INT First; 823 INT Length; 824}; 825 826#endif // !_GDIPLUSTYPES_HPP 827